/*
  Created with IntelliJ IDEA.
  @author  ranhongmin--2021/6/8
  Description:P5725 【深基4.习8】求三角形
 * 题目描述
 * 模仿例题，打印出不同方向的正方形，然后打印三角形矩阵。中间有个空行。
 * <p>
 * 输入格式
 * 输入矩阵的规模，不超过 9。
 * <p>
 * 输出格式
 * 输出矩形和正方形
 * <p>
 * 输入输出样例
 * 输入 #1复制
 * 4
 * 输出 #1复制
 * 01020304
 * 05060708
 * 09101112
 * 13141516
 * <p>
 * 01
 * 0203
 * 040506
 * 07080910
 * <p>
 * 01020304
 * 05060708
 * 09101112
 * 13141516
 * <p>
 * 01
 * 0203
 * 040506
 * 07080910
 * <p>
 * -----三角形前是两个空格 结束没有换行
*/

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
)

func main() {
	input := bufio.NewScanner(os.Stdin)
	input.Scan()
	inputText := input.Text()
	inputNum, _ := strconv.Atoi(inputText)

	count := 1
	inputNumDouble := inputNum * inputNum
	var str string
	for i := 0; i < inputNumDouble; i++ {

		if count < 10 {
			str = str + "0" + strconv.Itoa(count)
		} else {
			str = str + "" + strconv.Itoa(count)
		}

		if (count)%inputNum == 0 {
			fmt.Print(str)
			fmt.Println("")
			str = ""
		}

		count++
	}

	count = 1
	str = ""
	fmt.Println()

	for i := 0; i < inputNum; i++ {

		for j := 0; j < (inputNum - (i + 1)); j++ {
			str = str + " "
			str = str + " "
		}

		for k := 0; k <= (i); k++ {
			if count < 10 {
				str = str + "0" + strconv.Itoa(count)
			} else {
				str = str + "" + strconv.Itoa(count)
			}
			count++
		}

		fmt.Print(str)
		fmt.Println("")
		str = ""
	}

}
